METEORIX - Analyse des vecteurs vitesses

rm(list = ls())
### Chargement des librairies
library(ggplot2)
library(patchwork)
library(dplyr)
## 
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
## 
##     filter, lag
## Les objets suivants sont masqués depuis 'package:base':
## 
##     intersect, setdiff, setequal, union
library(FactoMineR)
library(randomForest)
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attachement du package : 'randomForest'
## L'objet suivant est masqué depuis 'package:dplyr':
## 
##     combine
## L'objet suivant est masqué depuis 'package:ggplot2':
## 
##     margin
library(rpart)
library(rpart.plot)
library(DMwR)
## Le chargement a nécessité le package : lattice
## Le chargement a nécessité le package : grid
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
### Chargement des fichiers csv
out1 <- read.csv("1out-2025-02-18T20:36:23.csv")
out2 <- read.csv("2out-2025-02-19T06:00:17.csv")
out3 <- read.csv("3out-2025-02-19T06:29:11.csv")
out4 <- read.csv("4out-2025-02-19T06:29:24.csv")
out5 <- read.csv("5out-2025-02-19T07:06:37.csv")
out6 <- read.csv("6out-2025-02-19T07:06:46.csv")
out7 <- read.csv("7out-2025-02-19T08:58:23.csv")
out8 <- read.csv("8out-2025-02-19T08:58:36.csv")
out9 <- read.csv("9out-2025-02-19T08:58:46.csv")
out10 <- read.csv("10out-2025-02-19T09:24:08.csv")
out11 <- read.csv("11out-2025-02-19T09:24:30.csv")
out12 <- read.csv("12out-2025-02-19T09:24:47.csv")
out1_c <- read.csv("1crop_out-2025-03-12T10:01:32.csv")
out2_c <- read.csv("2crop_out-2025-03-12T10:04:26.csv")
out3_c <- read.csv("3crop_out-2025-03-12T10:04:31.csv")
out4_c <- read.csv("4crop_out-2025-03-12T10:04:37.csv")
out5_c <- read.csv("5crop_out-2025-03-12T10:04:43.csv")
out6_c <- read.csv("6crop_out-2025-03-12T10:04:47.csv")
out7_c <- read.csv("7crop_out-2025-03-12T10:04:53.csv")
out8_c <- read.csv("8crop_out-2025-03-12T10:05:29.csv")
out9_c <- read.csv("9crop_out-2025-03-12T10:05:33.csv")
out10_c <- read.csv("10crop_out-2025-03-12T10:05:38.csv")
out11_c <- read.csv("11crop_out-2025-03-12T10:05:43.csv")
head(out1)
##       Fichier Vecteur.Moyen.X Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y
## 1  mvs-73.npy       0.3334223     0.014148425    0.6952196    0.2584659
## 2   mvs-5.npy       0.2432790    -0.001542530    0.6265431    0.3924669
## 3  mvs-22.npy       0.1263214    -0.004756871    0.4421079    0.3101159
## 4 mvs-192.npy       0.3362334     0.007676561    0.7386447    0.3166199
## 5  mvs-27.npy       1.8481767     0.151122020    3.0685975    2.1408885
## 6  mvs-53.npy       0.2685231     0.006961711    0.6199876    0.3306809
##       Norme
## 1 0.3671036
## 2 0.3139665
## 3 0.1579847
## 4 0.3790439
## 5 2.7196242
## 6 0.3079621
head(out1_c)
##       Fichier Vecteur.Moyen.X Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y
## 1  mvs-73.npy      0.23076923      0.00000000    0.6761916    0.0000000
## 2   mvs-5.npy     -0.07228916      0.00000000    0.3394940    0.0000000
## 3  mvs-22.npy      0.01935484     -0.02580645    0.1377688    0.2257143
## 4 mvs-192.npy      0.13580247      0.00000000    0.4375320    0.1571348
## 5  mvs-27.npy      2.69892473      0.30107527    5.3957071    3.6537945
## 6  mvs-53.npy      0.12195122     -0.01829268    0.7222972    0.1736467
##        Norme
## 1 0.23076923
## 2 0.07228916
## 3 0.04516129
## 4 0.16049383
## 5 5.63192787
## 6 0.14529529

1 - Analyse de la vidéo taille réélle

1.1 - Ensemble des frames

1.1.1 - Répartition des vecteurs vitesses

r1 <- ggplot(out1, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out1") + geom_point()
r2 <- ggplot(out2, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out2") + geom_point()
r3 <- ggplot(out3, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out3") + geom_point()
r4 <- ggplot(out4, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out4") + geom_point()
r5 <- ggplot(out5, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out5") + geom_point()
r6 <- ggplot(out6, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out6") + geom_point()

(r1 | r2 | r3)/(r4|r5|r6) +  plot_annotation(title = "Répartition des vecteurs vitesses")

r7 <- ggplot(out7, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out7") + geom_point()
r8 <- ggplot(out8, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out8") + geom_point()
r9 <- ggplot(out9, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out9") + geom_point()
r10 <- ggplot(out10, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out10") + geom_point()
r11 <- ggplot(out11, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out11") + geom_point()
r12 <- ggplot(out12, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out12") + geom_point()

(r7|r8|r9)/(r10|r11|r12)+plot_annotation(title = "Répartition des vecteurs vitesses")

Nous pouvons remarquer qu’il y a un déplacement vers la droite ce qui correspond bien à la vidéo lorsque que nous la regardons.

Nous remarquons aussi que seul l’encodage h264 est supporté, l’encodage h265 est inutile.

1.1.2 - Densité des vecteurs vitesses

# Créer une liste des noms des dataframes
out_list <- list(out1, out2, out3, out4, out5, out6, out7, out8, out9, out10, out11)

# Boucle pour générer chaque histogramme polaire
for (i in seq_along(out_list)) {
  outX <- out_list[[i]]  # Sélectionner le dataframe
  
  # Calculer les angles
  angles <- atan2(outX$Vecteur.Moyen.Y, outX$Vecteur.Moyen.X)
  
  # Convertir en dataframe
  df <- data.frame(angle = angles)
  
  # Convertir les angles en degrés
  df$angle_degrees <- (df$angle * 180 / pi) %% 360
  
  # Créer le graphique
  p <- ggplot(df, aes(x = angle_degrees)) +
    geom_histogram(aes(y = after_stat(density)), bins = 36, fill = "blue", alpha = 0.7) +
    coord_polar(start = 0) +
    theme_minimal() +
    labs(title = paste("Densité des directions - out", i),
         x = "Direction (degrés)", y = "Densité")
  
  # Afficher le graphique
  print(p)
}

Cela devient encore plus claire en affichant la densité (le degré 0 correspond à un déplacement vers la droite)

1.2 - Frame avec le météore

On va analyser les images sur laquelle il y a le météore (i.e de 98 à 104)

# Sélectionner les fichiers de "mvs-98.npy" à "mvs-104.npy"
out1_f <- out1 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out2_f <- out2 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out3_f <- out3 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out4_f <- out4 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out5_f <- out5 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out6_f <- out6 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out7_f <- out7 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out8_f <- out8 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out9_f <- out9 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out10_f <- out10 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out11_f <- out11 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
head(out1_f)
##       Fichier Vecteur.Moyen.X Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y
## 1  mvs-99.npy       1.4873308     0.066990628    2.6923592    1.9005170
## 2 mvs-102.npy       0.3723647     0.012446025    0.7712963    0.3614628
## 3 mvs-101.npy       0.2968710     0.007377258    0.6264239    0.2944350
## 4 mvs-104.npy       0.4562959     0.003293641    0.8690861    0.4321033
## 5 mvs-100.npy       0.1037510     0.003724395    0.4006968    0.2515966
## 6 mvs-103.npy       0.3717236     0.014826582    0.7548449    0.3425402
##       Norme
## 1 2.2181330
## 2 0.4082041
## 3 0.3326096
## 4 0.5176175
## 5 0.1361405
## 6 0.4076394

1.2.1 - Répartition des vecteurs vitesses

r1_f <- ggplot(out1_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out1") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r2_f <- ggplot(out2_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out2") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r3_f <- ggplot(out3_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out3") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r4_f <- ggplot(out4_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out4") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r5_f <- ggplot(out5_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out5") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r6_f <- ggplot(out6_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out6") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()

(r1_f | r2_f | r3_f)/(r4_f|r5_f|r6_f) +  plot_annotation(title = "Répartition des vecteurs vitesses")

r7_f <- ggplot(out7_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y,label = Fichier)) + labs(title = " Out7") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r8_f <- ggplot(out8_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out8") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r9_f <- ggplot(out9_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out9") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r10_f <- ggplot(out10_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out10") +geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r11_f <- ggplot(out11_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out11") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()

(r7_f|r8_f|r9_f)/(r10_f|r11_f)+plot_annotation(title = "Répartition des vecteurs vitesses")

1.2.2 - Densité des vecteurs vitesses

# Créer une liste des noms des dataframes
out_list_f <- list(out1_f, out2_f, out3_f, out4_f, out5_f, out6_f, out7_f, out8_f, out9_f, out10_f, out11_f)

# Boucle pour générer chaque histogramme polaire
for (i in seq_along(out_list_f)) {
  outX <- out_list_f[[i]]  # Sélectionner le dataframe
  
  # Calculer les angles
  angles <- atan2(outX$Vecteur.Moyen.Y, outX$Vecteur.Moyen.X)
  
  # Convertir en dataframe
  df <- data.frame(angle = angles)
  
  # Convertir les angles en degrés
  df$angle_degrees <- (df$angle * 180 / pi) %% 360
  
  # Créer le graphique
  p <- ggplot(df, aes(x = angle_degrees)) +
    geom_histogram(aes(y = after_stat(density)), bins = 36, fill = "blue", alpha = 0.7) +
    coord_polar(start = 0) +
    theme_minimal() +
    labs(title = paste("Densité des directions - out", i),
         x = "Direction (degrés)", y = "Densité")
  
  # Afficher le graphique
  print(p)
}

2 - Analyse de la vidéo rogner sur le météore

2.1 - Ensemble des frames

2.1.1 - Répartition des vecteurs vitesses

r1_c <- ggplot(out1_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out1") + geom_point()
r2_c <- ggplot(out2_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out2") + geom_point()
r3_c <- ggplot(out3_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out3") + geom_point()
r4_c <- ggplot(out4_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out4") + geom_point()
r5_c <- ggplot(out5_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out5") + geom_point()
r6_c <- ggplot(out6_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out6") + geom_point()

(r1_c | r2_c | r3_c)/(r4_c|r5_c|r6_c) +  plot_annotation(title = "Répartition des vecteurs vitesses")

r7_c <- ggplot(out1_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out1")  + geom_point()
r8_c <- ggplot(out2_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out2") + geom_point()
r9_c <- ggplot(out3_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out3") + geom_point()
r10_c <- ggplot(out4_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out4") + geom_point()
r11_c <- ggplot(out5_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out5") + geom_point()
#geom_errorbar(aes(ymin = Vecteur.Moyen.Y - Ecart.Type.Y, ymax = Vecteur.Moyen.Y + Ecart.Type.Y), width = 0.2) à rajouter pour l'écart type
(r7_c | r8_c | r9_c)/(r10_c|r11_c) +  plot_annotation(title = "Répartition des vecteurs vitesses")

Les vecteurs senmblent cette fois-ci centré en zéro, il n’y a donc pas de déplacement en arrière plan, ou plus léger.

2.1.2 - Densité des vecteurs vitesses

# Créer une liste des noms des dataframes
out_list_c <- list(out1_c,out2_c, out3_c, out4_c, out5_c, out6_c, out7_c, out8_c, out9_c, out10_c, out11_c)

# Boucle pour générer chaque histogramme polaire
for (i in seq_along(out_list_c)) {
  outX <- out_list_c[[i]]  # Sélectionner le dataframe
  
  # Calculer les angles
  angles <- atan2(outX$Vecteur.Moyen.Y, outX$Vecteur.Moyen.X)
  
  # Convertir en dataframe
  df <- data.frame(angle = angles)
  
  # Convertir les angles en degrés
  df$angle_degrees <- (df$angle * 180 / pi) %% 360
  
  # Créer le graphique
  p <- ggplot(df, aes(x = angle_degrees)) +
    geom_histogram(aes(y = after_stat(density)), bins = 36, fill = "blue", alpha = 0.7) +
    coord_polar(start = 0) +
    theme_minimal() +
    labs(title = paste("Densité des directions - out", i),
         x = "Direction (degrés)", y = "Densité")
  
  # Afficher le graphique
  print(p)
}

2.2 - Frame avec le météore

# Sélectionner les fichiers de "mvs-98.npy" à "mvs-104.npy"
out1_fc <- out1_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out2_fc <- out2_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out3_fc <- out3_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out4_fc <- out4_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out5_fc <- out5_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out6_fc <- out6_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out7_fc <- out7_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out8_fc <- out8_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out9_fc <- out9_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out10_fc <- out10_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out11_fc <- out11_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
head(out1_fc)
##       Fichier Vecteur.Moyen.X Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y
## 1  mvs-99.npy      1.77906977     -0.11627907    4.5708916    3.2328927
## 2 mvs-102.npy      0.02739726     -0.08219178    1.0333163    0.7071731
## 3 mvs-101.npy      0.16463415      0.01829268    0.7008483    0.3018755
## 4 mvs-104.npy      0.04687500      0.00000000    0.4653523    0.7288690
## 5 mvs-100.npy      0.11450382      0.04580153    0.7580733    0.5222178
## 6 mvs-103.npy      0.29370629      0.02097902    1.3783144    0.9568928
##       Norme
## 1 3.3499645
## 2 0.3162022
## 3 0.2317073
## 4 0.2404535
## 5 0.1695504
## 6 0.6182095

2.2.1 - Répartition des vecteurs vitesses

r1_fc <- ggplot(out1_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out1") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r2_fc <- ggplot(out2_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out2") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r3_fc <- ggplot(out3_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out3") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r4_fc <- ggplot(out4_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out4") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r5_fc <- ggplot(out5_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out5") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r6_fc <- ggplot(out6_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out6") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()

(r1_fc | r2_fc | r3_fc)/(r4_fc|r5_fc|r6_fc) +  plot_annotation(title = "Répartition des vecteurs vitesses")

r7_fc <- ggplot(out7_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y,label = Fichier)) + labs(title = " Out7") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r8_fc <- ggplot(out8_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out8") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r9_fc <- ggplot(out9_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out9") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r10_fc <- ggplot(out10_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out10") +geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r11_fc <- ggplot(out11_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out11") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()

(r7_fc|r8_fc|r9_fc)/(r10_fc|r11_fc)+plot_annotation(title = "Répartition des vecteurs vitesses")

2.2.2 Densité des vecteurs vitesses

# Créer une liste des noms des dataframes
out_list_fc <- list(out1_fc, out2_fc, out3_fc, out4_fc, out5_fc, out6_fc, out7_fc, out8_fc, out9_fc, out10_fc, out11_fc)

# Boucle pour générer chaque histogramme polaire
for (i in seq_along(out_list_fc)) {
  outX <- out_list_fc[[i]]  # Sélectionner le dataframe
  
  # Calculer les angles
  angles <- atan2(outX$Vecteur.Moyen.Y, outX$Vecteur.Moyen.X)
  
  # Convertir en dataframe
  df <- data.frame(angle = angles)
  
  # Convertir les angles en degrés
  df$angle_degrees <- (df$angle * 180 / pi) %% 360
  
  # Créer le graphique
  p <- ggplot(df, aes(x = angle_degrees)) +
    geom_histogram(aes(y = after_stat(density)), bins = 36, fill = "blue", alpha = 0.7) +
    coord_polar(start = 0) +
    theme_minimal() +
    labs(title = paste("Densité des directions - out", i),
         x = "Direction (degrés)", y = "Densité")
  
  # Afficher le graphique
  print(p)
}

3 - ACP

Une idée maintenant est de lancer une ACP sur un dataframe contenant des informations sur les vecteurs vitesses mais aussi les paramètres d’encodage pour voir lesquelles influe dessus.

On va mettre les variables preset, bitrate, encodage, pix_fmt et capture en facteur, l’objectif va être de déterminer quelle facteur permet de capturer le météore.

3.1 Ensemble des frames

### Chargement du dataframe
merge <- read.csv("merged_results2.csv", row.names = NULL)
head(merge)
##   Numéro Framerate Preset Images.Clés  Bitrate Encodage Pix_fmt
## 1      8        30     p7          10 variable     h264    gray
## 2      8        30     p7          10 variable     h264    gray
## 3      8        30     p7          10 variable     h264    gray
## 4      8        30     p7          10 variable     h264    gray
## 5      8        30     p7          10 variable     h264    gray
## 6      8        30     p7          10 variable     h264    gray
##                         Dossier     Fichier Vecteur.Moyen.X Vecteur.Moyen.Y
## 1 8crop_out-2025-03-12T10:05:29  mvs-73.npy      0.00000000      0.00000000
## 2 8crop_out-2025-03-12T10:05:29   mvs-5.npy      0.00000000      0.00000000
## 3 8crop_out-2025-03-12T10:05:29  mvs-22.npy     -0.07462687     -0.05970149
## 4 8crop_out-2025-03-12T10:05:29 mvs-192.npy     -0.13377926      0.00000000
## 5 8crop_out-2025-03-12T10:05:29  mvs-27.npy      0.00000000      0.00000000
## 6 8crop_out-2025-03-12T10:05:29  mvs-53.npy      0.00000000      0.00000000
##   Écart.Type.X Écart.Type.Y      Norme Capture
## 1    0.0000000    0.0000000 0.00000000       0
## 2    0.0000000    0.0000000 0.00000000       0
## 3    0.2627883    0.5521716 0.13432836       0
## 4    0.5506118    0.0000000 0.22742475       0
## 5    0.0000000    0.0000000 0.00000000       0
## 6    0.0789337    0.0000000 0.00623053       0
### Pré-traitement des données
merge_f <- select(merge, -c(Dossier,Fichier)) %>% filter(Norme!=0)
merge_f$Preset <- as.factor(merge_f$Preset)
merge_f$Bitrate <- as.factor(merge_f$Bitrate)
merge_f$Encodage <- as.factor(merge_f$Encodage)
merge_f$Pix_fmt <- as.factor(merge_f$Pix_fmt)
merge_f$Capture <- as.factor(merge_f$Capture)
head(merge_f)
##   Numéro Framerate Preset Images.Clés  Bitrate Encodage Pix_fmt Vecteur.Moyen.X
## 1      8        30     p7          10 variable     h264    gray     -0.07462687
## 2      8        30     p7          10 variable     h264    gray     -0.13377926
## 3      8        30     p7          10 variable     h264    gray      0.00000000
## 4      8        30     p7          10 variable     h264    gray      2.40495868
## 5      8        30     p7          10 variable     h264    gray      0.06185567
## 6      8        30     p7          10 variable     h264    gray      0.26404494
##   Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y      Norme Capture
## 1    -0.059701493    0.2627883   0.55217157 0.13432836       0
## 2     0.000000000    0.5506118   0.00000000 0.22742475       0
## 3     0.000000000    0.0789337   0.00000000 0.00623053       0
## 4    -0.157024793    5.4493589   2.95701509 4.30822254       0
## 5     0.000000000    0.3838966   0.00000000 0.06185567       0
## 6    -0.005617978    0.7953159   0.07474233 0.26637199       0
res.pca <- PCA(merge_f, quanti.sup = 1,quali.sup = c(3,5, 6,7,13),graph = FALSE)
barplot(res.pca$eig[,2])

plot(res.pca, choix="var")

Le premier axe représente les vecteurs de normes et écart type élevés à droite et à gauche ceux de norme et écart type faible. Le second axe est basé sur le nombre d’images clé et de framerate.

plot(res.pca, choix="ind", select="cos2 0.8" )

plot(res.pca, choix="ind", habillage=13, select="cos2 0.8", cex=0.9)

Faire l’analyse en composantes principales sur l’ensemble des frames n’as pas vraiment de sens, nous allons nous restreindre aux frames où le météore apparaît.

3.2 - Frame avec le météore

### Pré-traitement des données
merge_fc <-filter(merge, Fichier %in% paste0("mvs-", 96:104, ".npy")) %>% select(-c(Numéro, Dossier,Fichier))
merge_fc$Preset <- as.factor(merge_fc$Preset)
merge_fc$Bitrate <- as.factor(merge_fc$Bitrate)
merge_fc$Encodage <- as.factor(merge_fc$Encodage)
merge_fc$Pix_fmt <- as.factor(merge_fc$Pix_fmt)
merge_fc$Capture <- as.factor(merge_fc$Capture)
head(merge_fc)
##   Framerate Preset Images.Clés  Bitrate Encodage Pix_fmt Vecteur.Moyen.X
## 1        30     p7          10 variable     h264    gray      1.63636364
## 2        30     p7          10 variable     h264    gray     -0.11371237
## 3        30     p7          10 variable     h264    gray      0.02912621
## 4        30     p7          10 variable     h264    gray      0.82954545
## 5        30     p7          10 variable     h264    gray      0.00000000
## 6        30     p7          10 variable     h264    gray      0.01067616
##   Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y      Norme Capture
## 1      0.09848485    3.8598020    1.6916007 2.44492075       0
## 2      0.02341137    0.5728932    0.7424900 0.23107080       1
## 3      0.02912621    0.2712661    0.3254962 0.08493919       0
## 4     -0.23295455    2.3096713    2.3421155 1.27558217       1
## 5      0.00000000    0.0000000    0.0000000 0.00000000       0
## 6     -0.04270463    0.3210745    0.4110898 0.08672355       1
res.pca2 <- PCA(merge_fc, quali.sup = c(2,4, 5,6,12),graph = FALSE)
plot(res.pca2, choix="var")

On peut plus ou moins la même interpération des axes que précedemment, sauf pour le premier axe qui mets en opposition le Vecteur.Moyen.X et le Vecteur.Moyen.Y

plot(res.pca2, choix="ind", habillage=12, select="cos2 0.8", cex=0.9)
## Warning: ggrepel: 9 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

Nous pouvons clairement déterminer deux “zones” où des météores sont capturer. Dans les deux cas, la norme est assez faible mais cela peut être un biais dû au vecteurs vitesses qui ont une norme très importante. Les groupes correspondent à ceux avec 5, 10 ou 15 images clés.

plot(res.pca2, choix="ind", habillage=4, select="cos2 0.8", cex=0.9)
## Warning: ggrepel: 9 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

La combinaison bitrate variable et 10 images clés offre un bon compromis pour capturer le météore. Mais nous n’avons pas assez de données pour en tirer une vrai conclusion.

plot(res.pca2, choix="ind", habillage=2, select="cos2 0.8", cex=0.9)
## Warning: ggrepel: 9 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

Il faut utiliser un preset slow ou p7 (encore plus slow) pour capturer le météore, le preset fast ne fonctionne pas du tout.

3.3 - Conclusion ACP

Nous pouvons conclure que pour capturer le météore Il faut utiliser un preset lent pour obtenir une compression meilleure, c’est à dire ou la qualité est meilleure, il est difficile de trouver d’autre facteur déterminant à cause du faible nombres de données et qui sont toutes issus de la même vidéo.

4 - Classification supervisée

### Pré-traitement des données
merge_fc_class <-filter(merge, Fichier %in% paste0("mvs-", 96:104, ".npy")) %>% select(-c(Numéro, Dossier,Fichier,Écart.Type.X, Écart.Type.Y))
merge_fc_class$Preset <- as.factor(merge_fc_class$Preset)
merge_fc_class$Bitrate <- as.factor(merge_fc_class$Bitrate)
merge_fc_class$Encodage <- as.factor(merge_fc_class$Encodage)
merge_fc_class$Pix_fmt <- as.factor(merge_fc_class$Pix_fmt)
merge_fc_class$Capture <- as.factor(merge_fc_class$Capture)
head(merge_fc_class)
##   Framerate Preset Images.Clés  Bitrate Encodage Pix_fmt Vecteur.Moyen.X
## 1        30     p7          10 variable     h264    gray      1.63636364
## 2        30     p7          10 variable     h264    gray     -0.11371237
## 3        30     p7          10 variable     h264    gray      0.02912621
## 4        30     p7          10 variable     h264    gray      0.82954545
## 5        30     p7          10 variable     h264    gray      0.00000000
## 6        30     p7          10 variable     h264    gray      0.01067616
##   Vecteur.Moyen.Y      Norme Capture
## 1      0.09848485 2.44492075       0
## 2      0.02341137 0.23107080       1
## 3      0.02912621 0.08493919       0
## 4     -0.23295455 1.27558217       1
## 5      0.00000000 0.00000000       0
## 6     -0.04270463 0.08672355       1

Nous allons faire la classification sur les frames uniquement avec le météore, cela aura plus de sens.

table(merge_fc_class$Capture)
## 
##  0  1 
## 73 26

Les données sont mals répartis, on le rectifiera par la suite

# Création d'un échantillon train et d'un échantillon test
set.seed(1)
n <- nrow(merge_fc_class)
p <- ncol(merge_fc_class)-1
test.ratio <- .2 # ratio of test/train samples
n.test <- round(n*test.ratio)
n.test
## [1] 20
tr <- sample(1:n,n.test)
data.test <- merge_fc_class[tr,]
data.train <- merge_fc_class[-tr,]
print(table(data.train$Capture))
## 
##  0  1 
## 59 20
print(table(data.test$Capture))
## 
##  0  1 
## 14  6

4.1 - Random Forest data non équilibrées

fit_RF <- randomForest(Capture~.,data.train)
fit_RF
## 
## Call:
##  randomForest(formula = Capture ~ ., data = data.train) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 3
## 
##         OOB estimate of  error rate: 24.05%
## Confusion matrix:
##    0 1 class.error
## 0 55 4  0.06779661
## 1 15 5  0.75000000
plot(fit_RF)

En noire, erreur de classification totale, en rouge et verte les erreurs de classification pour les 2 classes : vert pour la classe capture et rouge pour la classe pas de capture.
Nous remarquons donc q’il y a beaucoup d’erreur pour la classe capture, nous n’avons pas assez de données pour avoir une erreur faible.

### Prédiction
class_RF= predict(fit_RF, newdata=data.test, type="class")
### Table de confusion
table(class_RF, data.test$Capture)
##         
## class_RF  0  1
##        0 14  3
##        1  0  3
### Acurracy
accuracy_RF = mean(class_RF == data.test$Capture)
accuracy_RF
## [1] 0.85

On va essayer de rééquilibrer le jeu de données

4.2 - Random forest data équilibrées

data.train.balanced <- SMOTE(Capture~., data.train)
table(data.train.balanced$Capture)
## 
##  0  1 
## 80 60
fit_RF2 <- randomForest(Capture~.,data.train.balanced)
fit_RF2
## 
## Call:
##  randomForest(formula = Capture ~ ., data = data.train.balanced) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 3
## 
##         OOB estimate of  error rate: 5%
## Confusion matrix:
##    0  1 class.error
## 0 79  1      0.0125
## 1  6 54      0.1000
plot(fit_RF2)

### Prédiction
class_RF2= predict(fit_RF2, newdata=data.test, type="class")
### Table de confusion
table(class_RF2, data.test$Capture)
##          
## class_RF2  0  1
##         0 11  2
##         1  3  4
### Acurracy
accuracy_RF2 = mean(class_RF2 == data.test$Capture)
accuracy_RF2
## [1] 0.75

En réquilibrant le jeu de données on obtient des résultats sensiblement meilleures.

4.2 Cart

arbre=rpart(Capture~.,data.train.balanced,control=rpart.control(minsplit=5,cp=0))
printcp(arbre)
## 
## Classification tree:
## rpart(formula = Capture ~ ., data = data.train.balanced, control = rpart.control(minsplit = 5, 
##     cp = 0))
## 
## Variables actually used in tree construction:
## [1] Bitrate         Framerate       Norme           Preset         
## [5] Vecteur.Moyen.X Vecteur.Moyen.Y
## 
## Root node error: 60/140 = 0.42857
## 
## n= 140 
## 
##          CP nsplit rel error  xerror     xstd
## 1 0.3500000      0   1.00000 1.00000 0.097590
## 2 0.1333333      1   0.65000 0.81667 0.094060
## 3 0.0833333      2   0.51667 0.63333 0.087695
## 4 0.0583333      3   0.43333 0.58333 0.085391
## 5 0.0444444      5   0.31667 0.48333 0.079918
## 6 0.0333333      8   0.18333 0.45000 0.077805
## 7 0.0083333      9   0.15000 0.38333 0.073070
## 8 0.0000000     11   0.13333 0.35000 0.070415
plotcp(arbre)

cp.opt <- arbre$cptable[which.min(arbre$cptable[, "xerror"]), "CP"]
cp.opt
## [1] 0
arbre.opt <- prune(arbre,cp.opt)
rpart.plot(arbre.opt, type=4)

4.3 Conclusion classification

Il est difficile d’obtenir des résultats intéressants du fait du peu de nombre de données, il faudrait avoir un dataframe mieux fourni.